package modelLayer;
import java.util.ArrayList;

/**
 * VareKartotek er singleton instansen som samler alt vedrørende varer
 * 
 * @author Gruppe 2
 * @version 1.0
 */
public class VareKartotek
{
    // instance variables - replace the example below with your own
    private ArrayList<VareGruppe> mineGrupper;
    private static VareKartotek instance;

    /**
     * Constructor for objekter af Varekartotek, den er privat da vi kører singleton form.
     */
    private VareKartotek()
    {
        mineGrupper = new ArrayList<VareGruppe>();
    }

    /**
     * Vores metode som skaber en instans af VareKartotek, den tjekker om en instans af VareKartotek eksistere,
     * hvis ikke bliver en skabt.
     */
    public static VareKartotek getInstance()
    {

        if(instance == null)
        {
            instance = new VareKartotek();
        }
        return instance;
    }

    /**
     * Metoden som tilføjer en VareGruppe til vores ArrayList mineGrupper. Den tjekker os om en VareGruppe med samme
     * stregkode eksistere i ArrayList, hvis ikke bliver den tilføjet.
     * @param VareGruppe vg
     */
    public void addVareGruppe(VareGruppe vg)
    {
        if(checkStregkode(vg) == false)
        {
            mineGrupper.add(vg);
        }
        else
        {
            System.out.println("Du kan ikke tilføje 2 vare grupper med samme stregkode");
        }
    }

    /**
     * En metode til at finde VareGruppe i vores ArrayList mineGrupper.
     * @param long stregkode
     */
    public VareGruppe findVareGruppe(long stregkode)
    {
        int index = 0;
        boolean searching = true;
        while(searching == true && mineGrupper.size()>index)
        {
            VareGruppe vg = mineGrupper.get(index);
            if(vg.getStregkode() == stregkode)
            {
                searching = false;
            }
            else
            {
                index++;
            }
        }
        if(!searching)
        {
            return mineGrupper.get(index);
        }
        else
        {
            return null;
        }
    }

    /**
     * En metode til at opdatere VareGruppe, bruger try and catch til at beskytte mod forsøg på at opdatere objekter
     * som ikke eksistere
     * @param long stregkode
     * @param String placering
     * @param long nyStregkode
     * @param String beskrivelse
     * @param int pris
     */
    public void opdaterVareGruppe(long stregkode, String placering,long nyStregkode, String beskrivelse, int pris)
    {
        boolean opdaterVareGruppe = false;
        while(opdaterVareGruppe == false)
        {
            try
            {
                VareGruppe vg = findVareGruppe(stregkode);
                vg.setPlacering(placering);
                vg.setStregkode(nyStregkode);
                vg.setBeskrivelse(beskrivelse);
                vg.setPris(pris);
                vg.setAntal();
                opdaterVareGruppe = true;
            }
            catch (Exception opdaterVareGrupper)
            {
                System.out.println("Kunne ikke finde VareGruppen - prøv en anden stregkode");
                opdaterVareGruppe = true;
            }
        }
    }

    /**
     * En metode til at slette varer fra vores VareGruppe.
     * @param long stregkode
     * @param long id
     */
    public void sletVare(long stregkode, long id)
    {
        VareGruppe vg = findVareGruppe(stregkode);
        vg.sletVare(id);
    }

    /**
     * En metode til at opdatere varer fra vores VareGruppe.
     * @param long stregkode
     * @param long id
     * @param long nyId
     */
    public void opdaterVare(long stregkode, long id, long nyId)
    {
        VareGruppe vg = findVareGruppe(stregkode);
        vg.opdaterVare(id, nyId);
    }

    /**
     * En metode som tilføjer varer til vores VareGruppe.
     * @param Vare v
     * @param long stregkode
     */
    public void addVare(Vare vare, long stregkode)
    {
        VareGruppe vg = findVareGruppe(stregkode);
        vg.addVare(vare);
    }

    /**
     * En metode til at finde varer i vores VareGruppe.
     * @param long stregkode
     * @param long id
     * @return Vare v
     */
    public Vare findVare(long stregkode, long id)
    {
        VareGruppe vg = findVareGruppe(stregkode);
        return vg.findVare(id);
    }

    /**
     * En metode som finde information vedrørende varer og gemmer dem i en ArrayList
     * @return ArrayList<String> print
     */
    public ArrayList<String> printVareKartotek()
    {
        ArrayList<String> print = new ArrayList<String>();
        for(VareGruppe vg : mineGrupper)
        {
            print.add("Placering: " + vg.getPlacering());
            print.add("Stregkode: " + vg.getStregkode());
            print.add("Beskrivelse: " + vg.getBeskrivelse());
            print.add("Pris: " + vg.getPris());
            print.add("Antal: " + vg.getAntal());
            print.addAll(vg.printVareGruppe());
        }
        return print;
    }

    /**
     * En metode some tjekker om en vare gruppe med samme stregkode allerede findes i vores ArrayList
     * hvis den finder en udksriver den en besked om at man ikke kan tilføje 2 med samme.
     * @param VareGruppe vg
     * @return boolean found
     */
    public boolean checkStregkode(VareGruppe vg)
    {
        boolean found = false;
        int index = 0;
        while(index < mineGrupper.size())
        {
            VareGruppe vStreg = mineGrupper.get(index);
            if(vg.getStregkode() != vStreg.getStregkode())
            {
                found = false;
                index++;
            }
            else
            {
                found = true;
                index++;
            }
        }
        return found;
    }
}

